package com.serviportales.contactenos.contactenos.beans;

import java.io.File;
import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.icefaces.ace.component.fileentry.FileEntry;
import org.icefaces.ace.component.fileentry.FileEntryEvent;
import org.icefaces.ace.component.fileentry.FileEntryResults;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

import com.liferay.util.bridges.jsf.common.FacesMessageUtil;
import com.serviportales.contactenos.datatypes.DataTypesRef;
import com.serviportales.contactenos.datatypes.EstadoMensaje;
import com.serviportales.contactenos.exception.ContactenosException;
import com.serviportales.contactenos.managers.MgrMensajes;
import com.serviportales.contactenos.managers.MgrMotivoContacto;
import com.serviportales.contactenos.model.Mensaje;
import com.serviportales.contactenos.model.MotivoContacto;
import com.serviportales.serviportales.beans.Contexto;
import com.serviportales.serviportales.model.DataTypesBeans;

@ManagedBean(name = "fcContactenos", eager = true)
@ViewScoped
public class FCContactenos implements Serializable {

	private static final long serialVersionUID = 1L;

	private Logger logger = Logger.getLogger(getClass());

	private Mensaje mensaje;
	private List<MotivoContacto> motivosContacto;
	private File adjunto;

	private void initMensaje() {
		this.mensaje = new Mensaje();
		mensaje.setMotivoContacto(new MotivoContacto());
		adjunto = null;
		if (adjunto != null) {
			adjunto.delete();
		}
	}

	private void initMotivosContacto() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			motivosContacto = ((MgrMotivoContacto) Contexto.getApplicationContext().getBean("mgrMotivoContacto")).getActiveMotivosContacto();
		} catch (ContactenosException contactenosException) {
			FacesMessageUtil.error(context, contactenosException.getMessage());
			logger.error(contactenosException.getMessage(), contactenosException);
		}
	}

	public void grabarMensaje() {
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			if (adjunto != null) {
				mensaje.setAdjunto(FileUtils.readFileToByteArray(adjunto));
			}
			mensaje.setEstadoMensaje(DataTypesBeans.getInstance().getBeanById(EstadoMensaje.class, DataTypesRef.ESTADO_MENSAJE_PENDIENTE));
			((MgrMensajes) Contexto.getApplicationContext().getBean("mgrMensajes")).grabarMensaje(mensaje);
			FacesMessageUtil.info(context, messageSource.getMessage(ContactenosException.GRABAR_EXITO, null, LocaleContextHolder.getLocale()));
			initMensaje();
		} catch (ContactenosException contactenosException) {
			FacesMessageUtil.error(context, contactenosException.getMessage());
			logger.error(contactenosException.getMessage(), contactenosException);
		} catch (Exception e) {
			FacesMessageUtil.error(context, e.getMessage());
			logger.error(e.getMessage(), e);
		}
	}

	public void adjuntoListener(FileEntryEvent e) {
		FileEntry fe = (FileEntry) e.getComponent();
		FileEntryResults results = fe.getResults();

		mensaje.setNombreAdjunto(null);
		mensaje.setExtensionAdjunto(null);

		for (FileEntryResults.FileInfo i : results.getFiles()) {
			if (i.isSaved()) {
				mensaje.setNombreAdjunto(i.getFileName());
				int pos = i.getFileName().lastIndexOf(".") + 1;
				mensaje.setExtensionAdjunto(i.getFileName().substring(++pos));
				adjunto = i.getFile();
			}
		}
	}

	public FCContactenos() {
		initMensaje();
		initMotivosContacto();
	}

	public Mensaje getMensaje() {
		return mensaje;
	}

	public void setMensaje(Mensaje mensaje) {
		this.mensaje = mensaje;
	}

	public List<MotivoContacto> getMotivosContacto() {
		return motivosContacto;
	}

	public void setMotivosContacto(List<MotivoContacto> motivosContacto) {
		this.motivosContacto = motivosContacto;
	}
}
